1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module glib.Thread;
26 
27 private import glib.ConstructionException;
28 private import glib.ErrorG;
29 private import glib.GException;
30 private import glib.Str;
31 private import glib.c.functions;
32 public  import glib.c.types;
33 private import linker.Loader;
34 
35 
36 /**
37  * The #GThread struct represents a running thread. This struct
38  * is returned by g_thread_new() or g_thread_try_new(). You can
39  * obtain the #GThread struct representing the current thread by
40  * calling g_thread_self().
41  * 
42  * GThread is refcounted, see g_thread_ref() and g_thread_unref().
43  * The thread represented by it holds a reference while it is running,
44  * and g_thread_join() consumes the reference that it is given, so
45  * it is normally not necessary to manage GThread references
46  * explicitly.
47  * 
48  * The structure is opaque -- none of its fields may be directly
49  * accessed.
50  */
51 public class Thread
52 {
53 	/** the main Gtk struct */
54 	protected GThread* gThread;
55 	protected bool ownedRef;
56 
57 	/** Get the main Gtk struct */
58 	public GThread* getThreadStruct(bool transferOwnership = false)
59 	{
60 		if (transferOwnership)
61 			ownedRef = false;
62 		return gThread;
63 	}
64 
65 	/** the main Gtk struct as a void* */
66 	protected void* getStruct()
67 	{
68 		return cast(void*)gThread;
69 	}
70 
71 	/**
72 	 * Sets our main struct and passes it to the parent class.
73 	 */
74 	public this (GThread* gThread, bool ownedRef = false)
75 	{
76 		this.gThread = gThread;
77 		this.ownedRef = ownedRef;
78 	}
79 
80 	~this ()
81 	{
82 		if ( Linker.isLoaded(LIBRARY_GLIB[0]) && ownedRef )
83 			g_thread_unref(gThread);
84 	}
85 
86 
87 	/**
88 	 * This function is the same as g_thread_new() except that
89 	 * it allows for the possibility of failure.
90 	 *
91 	 * If a thread can not be created (due to resource limits),
92 	 * @error is set and %NULL is returned.
93 	 *
94 	 * Params:
95 	 *     name = an (optional) name for the new thread
96 	 *     func = a function to execute in the new thread
97 	 *     data = an argument to supply to the new thread
98 	 *
99 	 * Returns: the new #GThread, or %NULL if an error occurred
100 	 *
101 	 * Since: 2.32
102 	 *
103 	 * Throws: GException on failure.
104 	 * Throws: ConstructionException GTK+ fails to create the object.
105 	 */
106 	public this(string name, GThreadFunc func, void* data)
107 	{
108 		GError* err = null;
109 
110 		auto __p = g_thread_try_new(Str.toStringz(name), func, data, &err);
111 
112 		if (err !is null)
113 		{
114 			throw new GException( new ErrorG(err) );
115 		}
116 
117 		if(__p is null)
118 		{
119 			throw new ConstructionException("null returned by try_new");
120 		}
121 
122 		this(cast(GThread*) __p);
123 	}
124 
125 	/**
126 	 * Waits until @thread finishes, i.e. the function @func, as
127 	 * given to g_thread_new(), returns or g_thread_exit() is called.
128 	 * If @thread has already terminated, then g_thread_join()
129 	 * returns immediately.
130 	 *
131 	 * Any thread can wait for any other thread by calling g_thread_join(),
132 	 * not just its 'creator'. Calling g_thread_join() from multiple threads
133 	 * for the same @thread leads to undefined behaviour.
134 	 *
135 	 * The value returned by @func or given to g_thread_exit() is
136 	 * returned by this function.
137 	 *
138 	 * g_thread_join() consumes the reference to the passed-in @thread.
139 	 * This will usually cause the #GThread struct and associated resources
140 	 * to be freed. Use g_thread_ref() to obtain an extra reference if you
141 	 * want to keep the GThread alive beyond the g_thread_join() call.
142 	 *
143 	 * Returns: the return value of the thread
144 	 */
145 	public void* join()
146 	{
147 		return g_thread_join(gThread);
148 	}
149 
150 	alias doref = ref_;
151 	/**
152 	 * Increase the reference count on @thread.
153 	 *
154 	 * Returns: a new reference to @thread
155 	 *
156 	 * Since: 2.32
157 	 */
158 	public Thread ref_()
159 	{
160 		auto __p = g_thread_ref(gThread);
161 
162 		if(__p is null)
163 		{
164 			return null;
165 		}
166 
167 		return new Thread(cast(GThread*) __p, true);
168 	}
169 
170 	/**
171 	 * Decrease the reference count on @thread, possibly freeing all
172 	 * resources associated with it.
173 	 *
174 	 * Note that each thread holds a reference to its #GThread while
175 	 * it is running, so it is safe to drop your own reference to it
176 	 * if you don't need it anymore.
177 	 *
178 	 * Since: 2.32
179 	 */
180 	public void unref()
181 	{
182 		g_thread_unref(gThread);
183 	}
184 
185 	/** */
186 	public static GQuark errorQuark()
187 	{
188 		return g_thread_error_quark();
189 	}
190 
191 	/**
192 	 * Terminates the current thread.
193 	 *
194 	 * If another thread is waiting for us using g_thread_join() then the
195 	 * waiting thread will be woken up and get @retval as the return value
196 	 * of g_thread_join().
197 	 *
198 	 * Calling g_thread_exit() with a parameter @retval is equivalent to
199 	 * returning @retval from the function @func, as given to g_thread_new().
200 	 *
201 	 * You must only call g_thread_exit() from a thread that you created
202 	 * yourself with g_thread_new() or related APIs. You must not call
203 	 * this function from a thread created with another threading library
204 	 * or or from within a #GThreadPool.
205 	 *
206 	 * Params:
207 	 *     retval = the return value of this thread
208 	 */
209 	public static void exit(void* retval)
210 	{
211 		g_thread_exit(retval);
212 	}
213 
214 	/**
215 	 * This function returns the #GThread corresponding to the
216 	 * current thread. Note that this function does not increase
217 	 * the reference count of the returned struct.
218 	 *
219 	 * This function will return a #GThread even for threads that
220 	 * were not created by GLib (i.e. those created by other threading
221 	 * APIs). This may be useful for thread identification purposes
222 	 * (i.e. comparisons) but you must not use GLib functions (such
223 	 * as g_thread_join()) on these threads.
224 	 *
225 	 * Returns: the #GThread representing the current thread
226 	 */
227 	public static Thread self()
228 	{
229 		auto __p = g_thread_self();
230 
231 		if(__p is null)
232 		{
233 			return null;
234 		}
235 
236 		return new Thread(cast(GThread*) __p);
237 	}
238 
239 	/**
240 	 * Causes the calling thread to voluntarily relinquish the CPU, so
241 	 * that other threads can run.
242 	 *
243 	 * This function is often used as a method to make busy wait less evil.
244 	 */
245 	public static void yield()
246 	{
247 		g_thread_yield();
248 	}
249 
250 	/**
251 	 * Sets the indicated @lock_bit in @address.  If the bit is already
252 	 * set, this call will block until g_bit_unlock() unsets the
253 	 * corresponding bit.
254 	 *
255 	 * Attempting to lock on two different bits within the same integer is
256 	 * not supported and will very probably cause deadlocks.
257 	 *
258 	 * The value of the bit that is set is (1u << @bit).  If @bit is not
259 	 * between 0 and 31 then the result is undefined.
260 	 *
261 	 * This function accesses @address atomically.  All other accesses to
262 	 * @address must be atomic in order for this function to work
263 	 * reliably. While @address has a `volatile` qualifier, this is a historical
264 	 * artifact and the argument passed to it should not be `volatile`.
265 	 *
266 	 * Params:
267 	 *     address = a pointer to an integer
268 	 *     lockBit = a bit value between 0 and 31
269 	 *
270 	 * Since: 2.24
271 	 */
272 	public static void bitLock(int* address, int lockBit)
273 	{
274 		g_bit_lock(address, lockBit);
275 	}
276 
277 	/**
278 	 * Sets the indicated @lock_bit in @address, returning %TRUE if
279 	 * successful.  If the bit is already set, returns %FALSE immediately.
280 	 *
281 	 * Attempting to lock on two different bits within the same integer is
282 	 * not supported.
283 	 *
284 	 * The value of the bit that is set is (1u << @bit).  If @bit is not
285 	 * between 0 and 31 then the result is undefined.
286 	 *
287 	 * This function accesses @address atomically.  All other accesses to
288 	 * @address must be atomic in order for this function to work
289 	 * reliably. While @address has a `volatile` qualifier, this is a historical
290 	 * artifact and the argument passed to it should not be `volatile`.
291 	 *
292 	 * Params:
293 	 *     address = a pointer to an integer
294 	 *     lockBit = a bit value between 0 and 31
295 	 *
296 	 * Returns: %TRUE if the lock was acquired
297 	 *
298 	 * Since: 2.24
299 	 */
300 	public static bool bitTrylock(int* address, int lockBit)
301 	{
302 		return g_bit_trylock(address, lockBit) != 0;
303 	}
304 
305 	/**
306 	 * Clears the indicated @lock_bit in @address.  If another thread is
307 	 * currently blocked in g_bit_lock() on this same bit then it will be
308 	 * woken up.
309 	 *
310 	 * This function accesses @address atomically.  All other accesses to
311 	 * @address must be atomic in order for this function to work
312 	 * reliably. While @address has a `volatile` qualifier, this is a historical
313 	 * artifact and the argument passed to it should not be `volatile`.
314 	 *
315 	 * Params:
316 	 *     address = a pointer to an integer
317 	 *     lockBit = a bit value between 0 and 31
318 	 *
319 	 * Since: 2.24
320 	 */
321 	public static void bitUnlock(int* address, int lockBit)
322 	{
323 		g_bit_unlock(address, lockBit);
324 	}
325 
326 	/**
327 	 * Determine the approximate number of threads that the system will
328 	 * schedule simultaneously for this process.  This is intended to be
329 	 * used as a parameter to g_thread_pool_new() for CPU bound tasks and
330 	 * similar cases.
331 	 *
332 	 * Returns: Number of schedulable threads, always greater than 0
333 	 *
334 	 * Since: 2.36
335 	 */
336 	public static uint getNumProcessors()
337 	{
338 		return g_get_num_processors();
339 	}
340 
341 	/**
342 	 * This is equivalent to g_bit_lock, but working on pointers (or other
343 	 * pointer-sized values).
344 	 *
345 	 * For portability reasons, you may only lock on the bottom 32 bits of
346 	 * the pointer.
347 	 *
348 	 * While @address has a `volatile` qualifier, this is a historical
349 	 * artifact and the argument passed to it should not be `volatile`.
350 	 *
351 	 * Params:
352 	 *     address = a pointer to a #gpointer-sized value
353 	 *     lockBit = a bit value between 0 and 31
354 	 *
355 	 * Since: 2.30
356 	 */
357 	public static void pointerBitLock(void* address, int lockBit)
358 	{
359 		g_pointer_bit_lock(address, lockBit);
360 	}
361 
362 	/**
363 	 * This is equivalent to g_bit_trylock(), but working on pointers (or
364 	 * other pointer-sized values).
365 	 *
366 	 * For portability reasons, you may only lock on the bottom 32 bits of
367 	 * the pointer.
368 	 *
369 	 * While @address has a `volatile` qualifier, this is a historical
370 	 * artifact and the argument passed to it should not be `volatile`.
371 	 *
372 	 * Params:
373 	 *     address = a pointer to a #gpointer-sized value
374 	 *     lockBit = a bit value between 0 and 31
375 	 *
376 	 * Returns: %TRUE if the lock was acquired
377 	 *
378 	 * Since: 2.30
379 	 */
380 	public static bool pointerBitTrylock(void* address, int lockBit)
381 	{
382 		return g_pointer_bit_trylock(address, lockBit) != 0;
383 	}
384 
385 	/**
386 	 * This is equivalent to g_bit_unlock, but working on pointers (or other
387 	 * pointer-sized values).
388 	 *
389 	 * For portability reasons, you may only lock on the bottom 32 bits of
390 	 * the pointer.
391 	 *
392 	 * While @address has a `volatile` qualifier, this is a historical
393 	 * artifact and the argument passed to it should not be `volatile`.
394 	 *
395 	 * Params:
396 	 *     address = a pointer to a #gpointer-sized value
397 	 *     lockBit = a bit value between 0 and 31
398 	 *
399 	 * Since: 2.30
400 	 */
401 	public static void pointerBitUnlock(void* address, int lockBit)
402 	{
403 		g_pointer_bit_unlock(address, lockBit);
404 	}
405 }